#include "socklib_ipv6.h"
int main(int argc, char *argv[]) {
 
	int i,res,port,s1,s2,s3,s4;
        char message[TAILLE_BUFF];
        char buffer[TAILLE_BUFF];
        char ip[TAILLE_BUFF];
        char port_chaine[TAILLE_BUFF];
	char *serveur;
	char *portName;
	char *userName;	
	char *buff;
	char *buff1;
	SSL *ssl = NULL;

	/* verification des arguments du main*/
	if(argc<4 || argc>5 ) {
		fprintf(stderr,"ERR:Usage : %s <user> <serveur> <port>\n", argv[0]);
	}
	else{
		serveur=argv[1];
		portName=argv[2];
		userName=argv[3];
		fprintf(stderr,"OK:.. Les arguments sont bons\n");
	}

	/*connection au serveur avec le port 21*/ 
        i=init_connect(portName,serveur);
        recv(i, buffer,TAILLE_BUFF,0);
        fprintf(stderr,"OK: Connexion effectuee\n");	
	
  	/* On vérifie si le serveur accepte le chiffrage*/
	if ((res = EnvoieMessage(i,"AUTH TLS\r\n"))<0) {  
                    perror("Probleme a l'envoie du message");
	}
        recv(i,buffer,TAILLE_BUFF,0);		
        affichage(buffer);

	if((buffer[0]=='5') && (buffer[1]=='3') && (buffer[2]=='0')) {
	/* ici le serveur n'accepte pas le chiffrage*/
		fprintf(stderr,"ERR: Ce serveur n'accepte pas le chiffrage\n");	
		ssl=NULL;
		if (ssl!=NULL)  {
   			fprintf(stderr,"ERR: probleme dans la fermeture \n");
			exit(1);
  		}	
		login(i,userName,argv[4]); 
		aide();
		while(strncmp(message,"QUIT",4)!=0) {
			 /* Initialisation de message */
			bzero(message,TAILLE_BUFF);
			/* Initialisation de buffer */
			bzero(buffer,TAILLE_BUFF); 
			read(0,message,TAILLE_BUFF);
			/* Envoie de la commande LIST */
		        if(strncmp(message,"LIST",4)==0) {
				EnvoieMessage(i,"PASV\r\n");
				recv(i,buffer,TAILLE_BUFF,0); 
				affichage(buffer);
				port=donnePort(buffer);              
				printf("le port pour le mode passif %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buffer,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip %s \n",ip);
				EnvoieMessage(i,message,"\r\n"); 
				connectLIST(port_chaine,ip,i,message);
				
			}	/* Envoie de la commande QUIT */
			else if(strncmp(message,"QUIT",4)==0) {
				if(recv(i,buffer,TAILLE_BUFF,0)<0)
					{
					perror("ERR: on a rien recu\n");
					}
				printf("%s\n",buffer);
			
			} /* Envoie de la commande RETR */
			else if(strncmp(message,"RETR",4)==0){
				EnvoieMessage(i,"PASV\r\n");
				recv(i,buffer,TAILLE_BUFF,0); 
				affichage(buffer);
				port=donnePort(buffer);              
				printf("le port calcule est:  %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buffer,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip obtenue est:  %s \n",ip);
				EnvoieMessage(i,message,"\r\n"); 
				connectRETR(port_chaine,ip,i,message,"fichier");
			
			}	/* Envoie de la commande STOR */
			else if(strncmp(message,"STOR",4)==0){
				EnvoieMessage(i,"PASV\r\n");
				recv(i,buffer,TAILLE_BUFF,0); 
				affichage(buffer);
				port=donnePort(buffer);              
				printf("le port calcule est:  %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buffer,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip obtenue est :  %s \n",ip);
				EnvoieMessage(i,message,"\r\n");
				connectSTOR(port_chaine,ip,i,message,"fichier1");
			}
			else {
				EnvoieMessage(i,message,"\r\n");
				buff1 = recoie_donnees(i);
				fprintf(stdout,"%s\n",buff1);
				free(buff1);buff1=NULL;
			}


		}


				  
	}	
	else {   /* ici le serveur accepte le chiffrage */
		ssl=chiffrerSSL(i);
		login_SSL(ssl,argv[3],argv[4]);
		aide();
	  	while(strncmp(message,"QUIT",4)!=0) {
			/* Initialisation de message */	
			bzero(message,256); 
			/* Initialisation de buffer */
			bzero(buffer,256); 
			
			read(0,message,TAILLE_BUFF);

			if(strncmp(message,"PASV",4)==0) {
				if ((res = EnvoieMessageSSL(ssl,"%s%s",message,"\r\n"))<0) {  
					perror("Probleme lors de l'envoie du message");
				}
				buff=recoie_donnees_SSL(ssl); 
				port=donnePort(buff);              
				printf("le port calcule est:  %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buff,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip obtenu est: %s \n",ip);                
			}     /* Envoie de la commande LIST */
			else if(strncmp(message,"LIST",4)==0) {
				if ((res = EnvoieMessageSSL(ssl,"PASV\r\n"))<0) {  
					fprintf(stderr,"Problemen lors de l'envoie du message");
				}
				buff=recoie_donnees_SSL(ssl); 
				port=donnePort(buff);              
				fprintf(stderr,"le port calcule est:  %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buff,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip obtenue est: %s \n",ip);
	
				if ((res = EnvoieMessageSSL(ssl,"PBSZ 0\r\n"))<0) {  
					fprintf(stderr,"Probleme lors de l'envoie du message");
				}
				recoie_donnees_SSL(ssl);

				if ((res = EnvoieMessageSSL(ssl,"PROT C\r\n"))<0) {  
					fprintf(stderr,"Probleme lors de l'envoie du message");
				}
				recoie_donnees_SSL(ssl);

				if ((res = EnvoieMessageSSL(ssl,message,"\r\n"))<0) {  
					fprintf(stderr,"Probleme lors de l'envoie du message");
				} 
				connectLIST_SSL(port_chaine,ip,ssl,message);
			}
			
			else if(strncmp(message,"QUIT",4)==0) {
				printf("Deconnexion effectuee !\n"); 
			}
			else if(strncmp(message,"RETR",4)==0) {
				if ((res = EnvoieMessageSSL(ssl,"PASV\r\n"))<0) {  
					perror("Probleme lors de l'envoie du message");
				}
				buff=recoie_donnees_SSL(ssl); 
				port=donnePort(buff);              
				printf("le port calcule est:  %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buff,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip obtenue est:  %s \n",ip);

				if ((res = EnvoieMessageSSL(ssl,"PBSZ 0\r\n"))<0) {  
					perror("Probleme a l'envoie du message");
				}
				recoie_donnees_SSL(ssl);

				if ((res = EnvoieMessageSSL(ssl,"PROT C\r\n"))<0) {  
					perror("Probleme a l'envoie du message");
				}
				recoie_donnees_SSL(ssl);
				if ((res = EnvoieMessageSSL(ssl,message,"\r\n"))<0) {  
					perror("Probleme a l'envoie du message");
				}
				connectRETR_SSL(port_chaine,ip,ssl,message,"ddd");
			}
			else if(strncmp(message,"STOR",4)==0){
				if ((res = EnvoieMessageSSL(ssl,"PASV\r\n"))<0) {  
					perror("Probleme a l'envoie du message");
				}
				buff=recoie_donnees_SSL(ssl); 
				port=donnePort(buff);              
				printf("le port pour le mode passif %d\n",port);
			        sprintf(port_chaine,"%d",port);
				sscanf(buff,"%*d %*s %*s %*s %*c%d%*c%d%*c%d%*c%d%*c%*s\n",&s1,&s2,&s3,&s4);
				sprintf(ip,"%d.%d.%d.%d\r\n",s1,s2,s3,s4);
				printf("l'adresse ip %s \n",ip);

				if ((res = EnvoieMessageSSL(ssl,"PBSZ 0\r\n"))<0) {  
					perror("Probleme lors de l'envoie du message");
				}
				recoie_donnees_SSL(ssl);

				if ((res = EnvoieMessageSSL(ssl,"PROT C\r\n"))<0) {  
					perror("Probleme lors de l'envoie du message");
				}
				recoie_donnees_SSL(ssl);
				if ((res = EnvoieMessageSSL(ssl,message,"\r\n"))<0) {  
					perror("Probleme lors de l'envoie du message");
				}
				connectSTOR_SSL(port_chaine,ip,ssl,message,"monficStor");
			}
			else{
				EnvoieMessageSSL(ssl,message,"\r\n");
				recoie_donnees_SSL(ssl);
			}
					  
		}
	}

        return 0;
}
